import _ from 'lodash';

export const DEFAULT_CACHE_PREFIX = 'aigc_'; // 默认缓存前缀,便于快速清除缓存

export const getStorage = (key: string): string | null =>
  sessionStorage.getItem(`${DEFAULT_CACHE_PREFIX}${key}`) || localStorage.getItem(`${DEFAULT_CACHE_PREFIX}${key}`);

export const saveStorage = (key: string, value: string, remember?: boolean): void => {
  const storage = remember ? localStorage : sessionStorage;
  storage.setItem(`${DEFAULT_CACHE_PREFIX}${key}`, value);
};

export function removeStorage(key: string): void {
  sessionStorage.removeItem(`${DEFAULT_CACHE_PREFIX}${key}`);
  localStorage.removeItem(`${DEFAULT_CACHE_PREFIX}${key}`);
}

/**
 * 支持两个版本 cn en
 * 上线后根据域名判断
 */
export const getLocale = (): string => 'cn';

export const delay = (timeout: number): Promise<void> => new Promise(resolve => setTimeout(resolve, timeout));

/**
 * 英文和中文字数统计
 */
export const calcWords = (str: string): number => {
  str = str.toLocaleLowerCase().replace(
    // eslint-disable-next-line no-useless-escape
    /[!"#$%&\\'()*+,\-.\/:;<=>?@\[\]^_`{|}~\u00A1\u00A7\u00AB\u00B6\u00B7\u00BB\u00BF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E3B\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]+/g,
    '',
  );
  if (str.trim() === '') return 0;

  const arr = str
    .replace(/[\uFF00-\uFFEF\u2000-\u206F]/g, '')
    .replace(/\s+/, ' ')
    .split(' ')
    .filter(n => n.trim());

  const reg =
    // eslint-disable-next-line no-misleading-character-class, no-irregular-whitespace
    /(\\d+)|[a-zA-ZÀ-ÿĀ-ſƀ-ɏɐ-ʯḀ-ỿЀ-ӿԀ-ԯഀ-ൿ]+|[⺀-⻿⼀-⿟　-〿㇀-㇯㈀-㋿㌀-㏿㐀-㿿䀀-䶿一-俿倀-忿怀-濿瀀-翿耀-迿退-鿿豈-﫿぀-ゟ゠-ヿㇰ-ㇿ㆐-㆟ᄀ-ᇿ㄰-㆏ꥠ-꥿가-꿿뀀-뿿쀀-쿿퀀-힯ힰ-퟿]/g;

  let words: string[] = [];
  arr.forEach(n => {
    let match: RegExpExecArray | null;
    const matches: string[] = [];
    while ((match = reg.exec(n))) {
      matches.push(match[0]);
    }
    words = words.concat(matches.length ? matches : [n]);
  });
  return words.length;
};

export const isTeam = import.meta.env.VITE_APP_TYPE === 'team';

/**
 * 获取树形数据
 * @param data
 * @param merge 是否合并id和name
 * @param sid 当前已选择数据id
 * @param pid 父级数据id
 * @returns {Array | undefined}
 */
export function getTree(data: any[] = [], merge?: boolean, sid?: any, pid: any = null): any[] | undefined {
  const children: any[] = [];
  _.forEach(data, node => {
    if (((!pid && !node.pid) || node.pid === pid) && node.id !== sid) {
      let depth = 1;
      if (node.pid) {
        const parent = _.find(data, { id: node.pid }) as any;
        depth = parent?.depth ? parent.depth + 1 : 1;
      }
      node.depth = depth;
      const { children: isChildren = '', ...nodes } = node;
      const childNodes = getTree(data, merge, sid, node.id);
      children.push({
        key: node.id,
        value: merge ? `${node.id},${node.name}` : `${node.id}`,
        label: node.name,
        depth,
        ...nodes,
        children: isChildren ? childNodes ?? [] : childNodes,
      });
    }
  });
  return children.length ? children : undefined;
}
